动态系统的工作状况随时间的变化通常可用微分方程来描述。我们关注的动态系统是那些包含嵌入式计算硬件和软件的系统,即所谓的动态嵌入式系统。汽车引擎及导航控制系统、装配生产线控制设备、卫星控制系统、空对空导弹制导以及火星探测器都是动态嵌入式系统的具体应用。
尽管动态系统部件的数学模型可以几种不同的方式用来分析和预测系统的工作状况,但我们关心的是建立一系列模型,并通过仿真来加以实现。
在动态嵌入式系统的发展中,仿真的应用可以追溯到早先的嵌入式计算时代,那时数字处理器总是zui先用于军事用途。仿真在产品开发过程的多个阶段都相当有用,从zui初的概念探讨直到维护软件的测试。仿真可轻易地将现实中的复杂非线性包含进去,而其它方法(如线性系统分析)通常会忽略或简化这些非线性。
回路硬件HIL(hardware-in-the-loop)仿真是一种特别有效的仿真,它将实时仿真装置连接到嵌入式计算设备。HIL仿真测试可在实验室环境下,对运行环境中嵌入式系统的重要部分进行全面、重复性的测试。与传统测试方法相比,这种方法的特点是能以较低的成本获得经过全面测试的产品。
为了对动态系统进行仿真,必须首先构建系统的数学模型,使其能以适当的精度描述系统部件及其与周围环境间的交互作用,然后再由该模型及其它类似积分算法的单元来构造系统的仿真。仿真中所用的模型必须相互兼容,以便信号能在具备适当单位和时序的模型之间自由流动。
一个完整的仿真必须包括仿真启动时对状态变量和其它参数的正确初始化,以及仿真执行过程中对模型动态方程的赋值和状态变量的积分。另外,仿真还必须具有友好的用户界面,以便用户能指定初始条件和模型参数以控制仿真的正常运行。
当在数字计算机上仿真连续的动态系统时,要利用数值积分算法来估计描述系统的微分方程解。尽管可以采用多种不同的数值积分算法,但必须选择一种适合于仿真的算法。
数值积分算法
假定可用一组成对的一阶微分方程来表示连续动态系统的工作状况。这些方程通常是非线性方程,因而很难或不可能求解,所以必须用数值算法来估计这些微分方程的解。
所用到的方程均为一阶微分方程,因为这些积分算法只适用于一阶方程,但是可以将任意含二阶(或更高阶)导数的微分方程转换为等价的一阶方程组。
我们将以微分方程的形式讨论数值积分算法:其中f(x,u(t))可为非线性函数,而u(t)是任意输入函数。
执行数值积分运算zui简单的算法之一根据连续函数导数的定义,如方程(1)所示。
如果h数值很小,该导数可用方程(2)近似。
若表示成采样次数的形式,其中整数下标n表示t=nh,变量上方的^表示其近似解,由此得到方程(3)。
这就是前向欧拉积分算法。它是一阶积分算法,因为它含有时间轴上某一点估值的函数f。该算法也是一种显函数方法,这意味着算法将不使用来自终值n的状态或输入。我们也可以利用反向差分来逼近该导数,如方程(4)所示。
差分方程的结果如方程(5)所示,这就是的反向欧拉积分算法。反向欧拉积分算法是一阶隐函数方法,因为状态是其自身的函数。隐函数法需要额外的计算来求解,通常采用Newton-Raphson算法等迭代技术。同显函数方法相比,隐函数法在精度和数值稳定性上都颇具优势,但其缺点是需要额外的计算,而且不能适应实时应用。
隐函数方法不适宜实时应用的原因主要有两个:迭代求解所需的执行时间不可预测;终值时刻的输入量必须具有un+1的形式,而当把时间步长n当作积分步长执行时,一般不会出现这样的形式。
也可以采用其它类型的数值积分算法,它们在特定应用中各有千秋。例如,Runge-Kutta系列算法对带有不连续仿真系统的函数f特别有效。为获得满意的精度,需要应用2到4阶积分算法,而不是前面讨论的一阶算法,因为高阶算法能得到比低阶算法更的结果。这就要对数值积分算法中误差来源及减小误差方法进行讨论。
积分误差
因为实现这些积分算法的差分方程所得到的总是微分方程解的逼近值,所以积分算法的每一步都会在近似解中引入误差。每个积分步骤出现的误差有两个来源:舍入误差和截断误差。
舍入误差是在计算中用精度有限的有理数(如计算机使用的浮点数)逼近精度无限的实数的结果。特定计算中舍入误差的大小取决于算术运算的数目和类型,以及浮点表示法的精度。具体的计算和算术运算序列给定以后,*能减小舍入误差的方法是增加计算中数字表示法的精度。例如,可以通过将单精度浮点数转换为双精度浮点数来实现。单精度浮点数通常具有十进制中7位的小数位,而双精度浮点数约为15位。与单精度浮点数相比,使用双精度浮点数的缺点是双精度变量占据两倍的内存空间,而且完成计算需要占用处理器更多的时间。
在实际系统的仿真中,单精度浮点数(而非双精度浮点数)的使用会在动态方程的解中引入很大的舍入误差。该问题的严重程度取决于动态方程的形式及所选的积分算法、积分时间步长和仿真运行的时间。在进行数值积分时,只要条件许可,我们通常倾向于在积分算法中使用双精度浮点数。相对于仿真精度提高所带来的好处,使用双精度浮点数所需的额外内存和处理时间都显得微不足道。
另一误差来源即截断误差是由不含舍入误差的积分步长产生的。换言之,截断误差是积分算法的步长在计算机上以无限数值精度执行而引起的误差。
每个积分算法都具有自身的截断误差特性。假定函数f对积分步长是连续的,并且使用一个充分小的步进时间h,就可以应用方程(6)来估计单个积分步长所引起的截断误差。其中常数a取决于函数f的局部特性及所用的积分算法,k是积分算法的阶数,h是积分步长。减小积分步长可将截断误差降低到任意小。然而这样做会增加仿真的执行时间,并将在解中增加舍入误差。使用高阶积分算法同样可以减小截断误差,但这种方法也有缺陷。高阶积分算法需要额外的执行时间,但其zui主要的缺陷是高阶算法将增加数值的不稳定性。
积分算法的稳定性
在积分开始时原本很小的舍入和截断误差在多次步进后将会无限增长下去,从而导致数值的不稳定。而太大的时间步长也会导致积分算法不稳定,并使估计动态方程解的差分方程变得不稳定。
动态系统和积分算法的每一种组合都有其稳定性特征。假定在平衡点附近能对仿真的非线性系统进行线性化。由此,可得出这样的定理:给定充分小的时间步长,只要仿真的动态系统在平衡点附近稳定,则积分算法就是稳定的。
我们将讨论方程(7)所示的一阶线性动态系统,其解如方程(8)所示。
可以考查不同积分时间步长对数值积分的影响。图1示出了采用方程(3)所示的欧拉算法,选取6个不同时间步长h得到的解。图1a中h=0.01,具有较高的精度;图1b中h=0.5,有明显的误差,但解的趋向与解基本一致;图1c中h=1,在一个步长后解趋于0,并维持不动,尽管解是稳定的,但显然不;图1d中h=1.9,解作衰减稳定的振荡;图1e中h=2,解作不衰减振荡,并具有恒定的振幅;图1f中h=2.1,解作振幅逐渐增大的振荡,这意味着系统不稳定。取更大的h值将使解的振幅增长更快。
在这一采用前向欧拉积分算法的仿真中,任何取值大于2的时间步长h都将得到数值上不稳定的解。从图1可以看出,h增大至系统不稳定时,任何关于解的度概念都失去了意义。当动态系统单元的时间常数取值差异不超过几个数量级时,这种情形便会发生。当系统时间常数间的差异超过几个数量级时,这类系统称为刚性系统。
刚性系统
系统可能既具备快速响应动态特性,又具备慢速响应动态特性,这可由系统模型的时间常数来描述。系统的刚性度定义为其zui大时间常数与zui小时间常数的比值。如果系统的刚性度是近似三个数量级或更高,就认为系统是刚性的。在仿真刚性系统时,必须仔细选择积分算法,以保证数值解的稳定性,并确保能以合理的执行效率得到的结果。
以图2中用Simulink模型描述的开环动态系统为例。该系统由驱动一阶对象的一阶执行器组成。执行器的时间常数为1ms,而对象的时间常数为1s,整个系统由单步输入驱动。
如果应用前向欧拉积分算法仿真图2所示的系统,并在10s时间内取步进时间为1.9ms,将会发现积分误差的峰值为0.001。如果将步进时间略微增加至2.01ms,数值将不稳定,而且截断误差会扩散。该例旨在说明:只要略微降低仿真精度,即便在轻度刚性系统中也会发生不稳定。
许多实际的动态系统具有比图1示例高几个数量级的刚性度。为了能应用任选的积分算法来仿真这些刚性度极高的系统,必须选择极小的时间步长来适应zui短的系统时间常数。这种情况下的效率极低,因为具有较长时间常数的系统部件不需要像仿真快速部件那样的短积分步长。实际上,如果在慢速响应部件中采用非常小的时间步长,整个仿真的精度将会受到舍入误差的影响,该舍入误差会通过所需的积分步长累积起来。
刚性系统仿真中常用到两种方法。一种是在刚性状况下仍表现良好的积分算法,在非实时仿真应用中,可以利用许多在刚性系统中表现良好的积分算法。例如上面介绍的隐函数法,在刚性系统中就具有良好的性能。Gear算法的隐函数主要面向刚性系统的仿真。通过应用那些在刚性条件下表现良好的积分算法,可以在采用比其它算法类型(如Runge-Kutta算法)具备更大时间步长的时候,保证系统的仿真精度和稳定性。
刚性系统仿真的第二种方法是采用多帧仿真。多帧仿真将仿真分为多个以不同帧速率运行的部分。在图2的示例中,可用0.1ms的步进时间进行激励器仿真,以0.1s的步进时间进行装置仿真。
在多帧方法中,必须内推或外推来自较慢帧速率子系统的值,并把它作为较快帧频子系统的输入值,这就增加了问题的复杂度。如果各种帧速率在同一处理器上运行,执行固定时间间隔的I/O就会有一定难度。
在以上两种仿真刚性系统的方法中,只有多帧方法适于实时应用,这是因为隐函数积分算法不适用于要求实时处理I/O的情形。在非实时情况下,采用刚性条件下性能良好的积分算法是zui简单易行的,可以避免与多帧方法相关联的难题。
离散-连续复合系统
由差分方程和微分方程共同建模的动态系统称为离散-连续复合系统,或简称复合系统。由于连续系统部件仿真所需的积分时间步长不同于离散子系统的时间步长,因此复合系统的仿真难度较大。此外,从离散部件到连续部件的输入可能会以非连续信号的形式出现,这进一步限制了积分算法的选择。
图3示出了由数字控制器控制连续装置的常见情形。控制器以固定刷新速率运行,而用来采样并量化信号的模数转换器则接收来自被控装置的输入电压。数字控制器的输出发送到数模转换器,并将该数值转换为电压,在下一次刷新前它将保持恒定。
通常,对于连续对象仿真的zui佳积分时间步长与控制器刷新间隔不一致,此时仿真必须采用多帧技术。要获得的仿真,装置模型往往需要比控制器刷新间隔更短的积分时间步长。在采用固定步长积分算法时,zui简便的方法是使积分步长为控制器刷新间隔的整约数。
当把从慢速响应系统传输到快速响应系统的输入作为数模转换器的输出时,由于信号在两次刷新期间保持不变,因此无需外推慢帧速率子系统的值。这在一定程度上简化了两种帧速率间的接口电路。
复合系统是动态系统仿真的重要应用领域。仿真经常用于复杂动态系统的设计、开发和测试,在这些系统中模拟装置是由嵌入式数字控制器控制的。
仿真示例
现在讨论一个动态系统的完整仿真的设计和实现,所选的仿真系统是一个由直流马达驱动的转盘。数字控制器接收受其控制的转盘角位置信息,并将之作为输入,然后产生驱动直流马达的控制电压,马达驱动转盘移动到指定位置。这是一个利用Simulink中的多帧技术进行仿真的离散-连续复合系统。要将控制器建模为具有5ms刷新间隔的数字系统,控制器的输入是由正交位置编码器测得的转盘位置,正交位置编码器输出分辨率为4,096步/周的数字角位移。控制器输出信号通过8位DAC转换为电压,再通过电压增益为1的功率放大器驱动直流马达。为了尽可能使用便宜的处理器,在每个刷新周期期间,控制器模型要用4ms完成运算。
在为动态系统建模时,必须确定表述每个部件的详细程度。所需细节的数量取决于仿真中的具体用途。在本例中,仿真的主要目的是使数字控制器的设计和实现能应用于转盘系统。因此,要尝试以良好的度对马达和转盘动态系统进行建模,并忽略功率放大器的动态特性,必须尽可能地模拟数字控制算法的特性。
我们将马达动态特性建模为二阶传递函数,该传递函数的输入为马达驱动电压,输出为马达速度。马达速度的积分可确定马达的位置。位置编码器向数字控制器输出马达位置的数字量化值。数字控制器的输入是受控转盘的位置及由编码器测得的当前位置。控制器的输出驱动功率放大器的模拟电压,功率放大器输出驱动马达。
图4示出了数字控制器控制算法的实现方法。因为该算法执行的时间间隔为5ms,Simulink模型要求添加标有“0阶保持1”、“1阶保持2”和“单位延迟”的方框,这些方框都具备一个设定为5ms刷新的参数。算法的其余部分由比例微分控制器组成,该控制器使用标有“导数估计”的离散时间传递函数来获得转盘角速率的估计值。控制算法的输出反馈到限幅和量化信号的8位DAC。“4ms传输延迟”方框将算法的输出延迟4ms,从而仿真出计算延时。
除了实现仿真模型外,还必须确定所用的积分算法及积分时间步长(如果使用的是固定步长型算法)。经试验测定使用1ms的时间步长和Simulink的4阶Runge-Kutta积分算法可得到满意的结果。通过执行一个步长时间为0.1ms的操作进行验证,结果没有显著变化。
系统的初始状态为转盘停在位置0。0时刻之后,指令将转盘移动到弧度1位置。大约5s之后,可看到转台到达指定位置。
再看一下图5所示的数字控制器输出,可得到位置编码器信号量化的结果。此外,不仅能看到输出信号在仿真初期约1.7s后饱和为zui大值,还能看到DAC输出信号电压的量化值。
转盘和控制器的仿真向我们提供了大量关于整个系统动态特性的信息。非线性系统特性的细节对于开发实际应用的设计至关重要。仿真的应用使人们能够通过改变模型参数及给部件模型增加额外的变化因素和复杂性因素来确定系统在各种条件下的特性。还能方便地改变研究以确定系统在设计修改时表现出的特性。这些修改包括不同的控制器刷新速率、不同的DAC位或不同的编码器分辨率等。
本文总结
仿真是复杂嵌入式系统开发和测试中重要且常用的技术。从zui初产品概念的定义到工程开发,再到维护软件发布和硬件升级测试的全过程都要应用仿真。在开发项目中采用适宜的仿真不但能降低工程所需的总体时间和费用,而且可开发出经过完全测试的高质量产品。